package com.ftg.learn.chapter13.example;


import java.util.Objects;

/**
 * 用来管理 item节点  生成 linked 链式存储结构  线性表 线性存储结构{链式存储结构|顺序存储结构}
 *
 * @author kangjx
 * @createTime 2022/8/11
 */
public class ItemLinked {

    /**
     * 必须要有初始头
     *
     * @param t
     */
    public ItemLinked(int t) {
        this.head = new Item(t);
        this.last = this.head;
    }

    public ItemLinked() {
    }

    /**
     * 头节点
     */
    private Item head;
    /**
     * 尾节点
     */
    private Item last;
    private Item prevLast;

    private int n = 1;

    /**
     * 对链式存储结构进行追加操作
     *
     * @param t
     * @return
     */
    public boolean add(int t) {
        if (Objects.isNull(head)) {
            head = new Item(t);
            last = head;
            n++;
            return true;
        }
        last.setNext(new Item(t));
        this.last = this.last.getNext();
        n++;
        return true;
    }

    /**
     * 删除头节点
     *
     * @return
     */
    public boolean delHead() {
        this.checkedDel();

        if (this.size() == 1) {
           return this.delOnlyOne();
        }

        head = head.getNext();
        n--;
        return true;
    }

    /**
     * 删除只有一个的情况
     * @return
     */
    private boolean delOnlyOne(){
        head = null;
        last = null;
        n--;
        return true;
    }

    /**
     * 删除 前的判断
     */
    private void checkedDel(){
        if (this.size() == 0) {
            throw new RuntimeException("没有节点");
        }
    }

    /**
     * 删除尾
     * @return
     */
    public boolean delLast() {

        checkedDel();

        if(this.size() == 1){
            return this.delHead();
        }

        last = this.getToTheSecond();
        n--;
        return true;
    }

    /**
     * 获得倒数第二个
     * @return
     */
    public Item getToTheSecond(){
        int num = 1;
        Item temp = head;
        while(!Objects.isNull(temp.getNext()) && num < this.size() - 1){
            temp = temp.getNext();
            num++;
        }
        return temp;
    }

    /**
     * 求链表当中元素个数
     *
     * @return
     */
    public int size() {
        return n;
    }

}
